package bite;
import java.util.*;
/**
 * Creared with IntelliJ IDEA.
 * Description:【蘑菇阵】现在有两个好友A和B，住在一片长有蘑菇的由n＊m个方格组成的草地，A在(1,1),B在(n,m)。现在A想要拜访B，由于她只想去B的家，所以每次她只会走
 * (i,j+1)或(i+1,j)这样的路线，在草地上有k个蘑菇种在格子里(多个蘑菇可能在同一方格),问：A如果每一步随机选择的话(若她在边界上，则只有一种选择)，那么她不
 * 碰到蘑菇走到B的家的概率是多少？
 * User:yxd
 * Date:2022-06-17
 * Time:14:35
 */
public class Day38_2 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        while(input.hasNext()){
            int n = input.nextInt();
            int m = input.nextInt();
            //k个蘑菇
            int k = input.nextInt();
            double[][] nums = new double[n + 1][m + 1];
            boolean[][] falg = new boolean[n + 1][m + 1];
            while(k-- != 0){;
                int x = input.nextInt();
                int y = input.nextInt();
                //有蘑菇的地方为true
                falg[x][y] = true;
            }
            //状态定义F(i,j) 表示当前位置没有蘑菇的概率
            //状态转移方程:如果再边界只能由一个地方到达就是上边或者左边就是*1,其余地方就是*0.5
            //F(i,j) = F(i - 1,j) * (j == m ? 1:0.5) + F(i,j - 1)*(i == n? 1: 0.5)  有蘑菇的地方概率为0
            //赋初值F(1,1) = 1.0;
            for(int i = 1;i <= n;i ++){
                for(int j = 1;j <= m;j ++){
                    if(i == 1 && j == 1){
                        //初始化起点
                        nums[i][j] = 1.0;
                    }else if(falg[i][j]){
                        //有蘑菇的地方一定不能到达
                        nums[i][j] = 0.0;
                    }else{
                        //没有蘑菇的地方
                        nums[i][j] = nums[i - 1][j] * (j == m ? 1.0 : 0.5) + nums[i][j - 1] * (i == n ? 1.0 : 0.5);
                    }
                }
            }
            System.out.printf("%.2f\n",nums[n][m]);
        }
    }
}
